package com.example.source.okhttp

import okhttp3.OkHttpClient
import okhttp3.Request

/**
 *OkHttpClient：这个是整个OkHttp的核心管理类，所有的内部逻辑和对象归OkHttpClient统一来管理，它通过Builder构造器生成，构造参数和类成员很多，这里先不做具体的分析。

Request 和Response：Request是我们发送请求封装类，内部有url, header , method，body等常见的参数，
Response是请求的结果，包含code, message, header,body ；这两个类的定义是完全符合Http协议所定义的请求内容和响应内容。

RealCall ：负责请求的调度（同步的话走当前线程发送请求，异步的话则使用OkHttp内部的线程池进行）；
同时负责构造内部逻辑责任链，并执行责任链相关的逻辑，直到获取结果。虽然OkHttpClient是整个OkHttp的核心管理类，
但是真正发出请求并且组织逻辑的是RealCall类，它同时肩负了调度和责任链组织的两大重任，接下来我们来着重分析下RealCall类的逻辑。
 **/
private fun theSimplestWayToWrite() {
    val okHttpClient = OkHttpClient()//通过OkHttpClient的内部类Builder新建
    okHttpClient.get("https://square.github.io/okhttp/")

}

/**
 *RealCall类并不复杂，有两个最重要的方法，execute() 和 enqueue()，一个是处理同步请求，一个是处理异步请求。
 * 跟进enqueue的源码后发现，它只是通过异步线程和callback做了一个异步调用的封装，最终逻辑还是会调用到execute()这个方法，
 * 然后调用了getResponseWithInterceptorChain()获得请求结果。
 **/
private fun OkHttpClient.get(url: String): String? =
    this.newCall(Request.Builder().url(url).build()).execute().body?.string()

/**
 *从源码可以看到，即使是 getResponseWithInterceptorChain() 方法的逻辑其实也很简单，它生成了一个Interceptors拦截器的List列表，按顺序依次将：

client.Interceptors
RetryAndFollowUpInterceptor,
BridgeInterceptor
CacheInterceptor
ConnectInterceptor
client.networkInterceptors
CallServerInterceptor
这些成员添加到这个List中，然后创建了一个叫RealInterceptorChain的类，最后的Response就是通过chain.proceed获取到的。

通过进一步分析RealInterceptorChain和Interceptors，我们得到了一个结论，OkHttp将整个请求的复杂逻辑切成了一个一个的独立模块并命名为拦截器(Interceptor)，
通过责任链的设计模式串联到了一起，最终完成请求获取响应结果。
 **/